package com.qidian.mes.qc.interceptor;/**
 * ClassName:RequestHandlerInterceptor
 * Package:com.qidian.util.interceptor
 **/

import com.qidian.mes.qc.annotations.CheckParam;
import com.qidian.mes.util.Tools;
import com.qidian.mes.util.pojo.QdResult;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Arrays;

/**
 * @Author ppc
 * @Conpany study
 * @Description:
 * @Time 2024/4/17 20:29
 *
 **/
public class RequestHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
       //将handler转换为HandlerMethod
        if(handler instanceof HandlerMethod){
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            //获取被拦截的方法对象
            Method method = handlerMethod.getMethod();
            //获取这个方法的所有参数
            Parameter[] parameters = method.getParameters();
            Arrays.stream(parameters).forEach(parameter -> {
                //获取每个参数的CheckParam注解，如果这个参数没有添加注解就获取不到
                CheckParam annotation = parameter.getAnnotation(CheckParam.class);
                if(annotation != null){
                    if(annotation.required() && parameter.getName()!=null ){
                        //获取参数名称
                        String name = parameter.getName();
                        //获取参数的值
                        Object value = request.getParameter(name);
                        if(value == null){
                            System.out.println(Tools.object2json(QdResult.error(500, "参数传递有误。你传入的参数为空！！")));

                        }

                    }
                    if(annotation.type() != null && annotation.type() == Integer.class && parameter.getName()!=null){
                        //获取参数名称
                        String name = parameter.getName();
                        //获取参数的值
                        Object value = request.getParameter(name);
                        if(value == null){
                            System.out.println(Tools.object2json(QdResult.error(500, "参数传递有误。你传入的参数类型不正确！！")));

                        }
                        if(value.toString().length() == 0){
                            System.out.println(Tools.object2json(QdResult.error(500, "参数传递有误。你传入的参数为空！！")));

                        }
                    }

                    if(annotation.allowedValues() != null && parameter.getName()!=null) {
                        if(Arrays.asList(annotation.allowedValues()).contains(request.getParameter(parameter.getName()))){
                            System.out.println(Tools.object2json(QdResult.error(500, "参数传递有误。你传入的参数不在允许的范围内！！")));
                        }
                    }
                    //比较大小
                    if(annotation.range() == true && parameter.getName()!=null){
                        if(annotation.min() != 0 && annotation.max() != 0){
                            if(Integer.parseInt(request.getParameter(parameter.getName())) < annotation.min() || Integer.parseInt(request.getParameter(parameter.getName())) > annotation.max()){
                                System.out.println(Tools.object2json(QdResult.error(500, "参数传递有误。你传入的参数不在允许的范围内！！")));
                            }
                        }
                    }
                }


            });
        }
        return true;
    }


}
